home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / reader_requests / scilab / maple / maple2scilab.maple next >
Text File  |  1999-09-16  |  4KB  |  128 lines

  1. maple2scilab:=proc(macroname,expr,arguments)
  2. # Converts a maple matrix function into a scilab macro.
  3. # The maple matrix is a function of arguments as well as
  4. # the scilab macro.
  5. # rpath, global Maple variable is the pathname for the
  6. # source code of the scilab function and fortran routine
  7. local fname,sname,maplematrix,outputsize,lpath:
  8. if type(expr,scalar) then 
  9.  maplematrix:=vector([expr]):
  10.  maplematrix:=convert(maplematrix,matrix):
  11. else:
  12.  maplematrix:=convert(expr,matrix):
  13. fi:
  14. if substring(rpath,1..5) = `rpath` then lpath:=``:else:lpath:=rpath:fi:
  15. fname:=cat(``.lpath,macroname,`.f`):
  16. sname:=cat(``.lpath,macroname,`.sci`):
  17. outputsize:=[rowdim(maplematrix),coldim(maplematrix)]:
  18. print(`Write files <`.sname.`>`):
  19. print(`and <`. fname. `>`):
  20. make_fortran(fname,macroname,maplematrix,arguments):
  21. make_scilab(sname,macroname,macroname,arguments,outputsize):
  22. end:
  23.  
  24.  
  25. make_fortran:=proc(filename,routinename,maplematrix,arguments)
  26. #
  27. #This procedure converts the maple matrix ``maplematrix'' into a fortran 
  28. #subroutine.
  29. #The fortran calling sequence is routinename(x1,x2,...,xn,matrix)
  30. #and the subroutine computes matrix(i,j) as a function of
  31. #the arguments x1,x2,...,xn.
  32. #Each argument can be a maple scalar or array which should be
  33. #in the list ``arguments''.
  34. #The subroutine is put into a file named filename (character string).
  35. #
  36. global optimized:
  37. local flist,matr,listarg,m,k:
  38. #Maple V Release 2
  39. if interface(version)=`SCG2`     then 
  40.   read ``.libname.`/macrofor.m`:
  41. #Maple V Release 3
  42. elif not(assigned(macrofor)) and 
  43.    substring(interface(version),18..18) =`3` then
  44.    with(share):readshare(macrofor,numerics):
  45. fi:
  46. init_genfor():
  47. matr:=convert(maplematrix,matrix):
  48. listarg:=[]:
  49. for k in arguments do
  50.   if type(op(k),vector) 
  51.    then listarg:=[op(listarg),k[rowdim(convert(k,matrix))]];
  52.    elif type(op(k),matrix) 
  53.     then listarg:=[op(listarg),k[rowdim(convert(k,matrix)),
  54.                                  coldim(convert(k,matrix))]];
  55.    else listarg:=[op(listarg),k];
  56.   fi;
  57. od;
  58. flist:=[subroutinem,routinename,[op(arguments),fmat],
  59.            [
  60.             [ declaref,`implicit doubleprecision`,[`(t)`] ],
  61.             [ declaref,doubleprecision,listarg ],
  62.             [ declaref,doubleprecision,[fmat[rowdim(matr),coldim(matr)]] ],
  63.             [ matrixm,fmat,matr ] 
  64.            ]
  65.         ]:
  66. optimized:=true:
  67. writeto(filename):
  68. genfor(flist):
  69. writeto(terminal):
  70. end:
  71.  
  72.  
  73. make_scilab:=proc(filename,macroname,routinename,arguments,outputsize)
  74. # This procedure generates the scilab macro which calls
  75. # the fortran subroutine ``routinename''.
  76. #
  77. local k,kk,l1,l2,ff,first0,ss,snd0,thrd,forth,rest,chain,i,nargs:
  78. #
  79. ff:=cat(`(`,arguments[1]):
  80. k:=2:
  81. nargs:=nops(arguments):
  82. while k < nargs+1 do ff:=cat(ff,`,`,arguments[k]):k:=k+1:od:
  83. ff:=cat(ff,`)`):
  84. ff:=cat(`function [var]=`,macroname,ff):
  85. l1:=0:
  86. rest:=first:
  87. if length(ff) > 70 then 
  88.  while length(rest) > 70 do
  89.   first.l1:=cat(substring(rest,1..70),`...`):
  90.   l1:=l1+1:
  91.   first.l1:=substring(rest,71..length(rest)):
  92.   rest:=first.l1:
  93.  od:
  94.  else
  95.  first.0:=ff:
  96. fi:
  97. #
  98. ss:=cat(`var=fort(`,`'`,routinename,`',`):
  99. i:=1:
  100. for kk in arguments do chain:=cat(kk,`,`,i,`,`,`'d',`):
  101.   ss:=cat(ss,chain):
  102.   i:=i+1:
  103. od:
  104. ss:=cat(ss,`'out',`):
  105. ss:=cat(ss,`[`,outputsize[1],`,`,outputsize[2],`],`,nargs+1,`,'d')`):
  106. l2:=0:
  107. rest:=ss:
  108. if length(ss) > 70 then 
  109.  while length(rest) > 70 do
  110.   snd.l2:=cat(substring(rest,1..70),`...`):
  111.   l2:=l2+1:
  112.   snd.l2:=substring(rest,71..length(rest)):
  113.   rest:=snd.l2:
  114.  od:
  115.  else
  116.  snd.0:=ss:
  117. fi:
  118. writeto(filename):
  119. for i from 0 to l1 do lprint(``.first.i):od:
  120. for i from 0 to l2 do lprint(``.snd.i):od:
  121. lprint(`//end`):
  122. writeto(terminal):
  123. #
  124. end:
  125.  
  126.  
  127.